package pe.com.cineplanet.dao.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

import pe.com.cineplanet.bean.cineplanet.Actor;
import pe.com.cineplanet.bean.cineplanet.Comentario;
import pe.com.cineplanet.bean.cineplanet.Constantes;
import pe.com.cineplanet.bean.cineplanet.Pelicula;
import pe.com.cineplanet.bean.cineplanet.UsuarioWeb;
import pe.com.cineplanet.dao.dao.PeliculaDAO;


public class PeliculaDAOImpl implements PeliculaDAO{

	protected JdbcTemplate jdbcTemplate;

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	
	public Pelicula findById(String id) {
		String sql = "select id, titulo, tipo_pelicula, tipo_publico, tipo_emision, pais from T_PELICULA where id=?";
		Object[] params = new Object[]{ id };
		
		try{
			return (Pelicula) jdbcTemplate.queryForObject(sql, params, new RowMapper(){

				public Pelicula mapRow(ResultSet rs, int arg1) throws SQLException {
					Pelicula pelicula = new Pelicula(rs.getString(1), 
							rs.getString(2), 
							rs.getString(3), 
							rs.getString(4),
							rs.getString(5),
							rs.getString(6));
					return pelicula;
				}
				
			});
		}catch(EmptyResultDataAccessException e){
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Pelicula> findByNombre(String titulo) {
		String sql = "select id, titulo, tipo_pelicula, tipo_publico, tipo_emision, pais from T_PELICULA where titulo like ?";
		Object[] params = new Object[]{"%" + titulo + "%"};
		
		try{
			return jdbcTemplate.query(sql, params, new RowMapper(){

				public Pelicula mapRow(ResultSet rs, int arg1) throws SQLException {
					System.out.println("..." + rs.getString(3));
					Pelicula pelicula = new Pelicula(rs.getString(1), 
							rs.getString(2), 
							rs.getString(3), 
							rs.getString(4),
							rs.getString(5),
							rs.getString(6));
					return pelicula;
				}
				
			});
		}catch(EmptyResultDataAccessException e){
			return null;
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<Actor> listActores(Pelicula p) {
		
		StringBuffer sql =  new StringBuffer();
		sql.append("select a.nombre, u.personaje ");
		sql.append("from T_PELICULA_ACTOR u ");
		sql.append(" inner join T_ACTOR a on a.id = u.id_actor ");
		sql.append(" where id_pelicula = ?");
		
		Object[] params = new Object[]{ p.getId() };
		
		List<Actor> list = jdbcTemplate.query(sql.toString(), params, new RowMapper(){

			public Actor mapRow(ResultSet rs, int arg1) throws SQLException {
				
				return new Actor(rs.getString(1), rs.getString(2));
			}
			
		});
		
		return list;
			
	}
	
	@SuppressWarnings("unchecked")
	public List<Comentario> mostrarComentarios(Pelicula p){
		
		StringBuffer sql =  new StringBuffer();
		sql.append("select id, u.login, u.nombre, u.correo, descripcion, c.estado, fecha, voto_pos, voto_neg  ");
		sql.append("from T_COMENTARIO c ");
		sql.append(" inner join T_USUARIO_WEB u on u.login = usuario_web ");
		sql.append(" where id_pelicula = ?");
		
		Object[] params = new Object[]{ p.getId() };
		
		List<Comentario> list = jdbcTemplate.query(sql.toString(), params, new RowMapper(){

			public Comentario mapRow(ResultSet rs, int arg1) throws SQLException {
				
				UsuarioWeb usuarioWeb = new UsuarioWeb(rs.getString(2), rs.getString(3), rs.getString(4));
				Comentario c = new Comentario(rs.getInt(1), usuarioWeb, rs.getString(5));
				c.setEstado(rs.getString(6));
				c.setFecha(rs.getDate(7));
				c.setVoto_pos(rs.getInt(8));
				c.setVoto_neg(rs.getInt(9));
				return c;
			}
			
		});
		
		return list;
		
	}
	
	public boolean registrarComentario(Pelicula p, UsuarioWeb usuario, String desc){
		System.out.println("\tRegistrar un comentario");
		System.out.println("\t------------------------------------");
		System.out.println("\t Pelicula: " + p.getTitulo());
		System.out.println("\t Usuario: " + usuario.getLogin());
		System.out.println("\t Comentario: " + desc);
		
		StringBuffer sql =  new StringBuffer();
		sql.append("insert into t_comentario ");
		sql.append("(id_pelicula, usuario_web, descripcion, estado, fecha, voto_pos, voto_neg) ");
		sql.append("values (?, ?, ?, ?, sysdate(),0,0)");
		
		Object[] params = new Object[]{ p.getId(), usuario.getLogin(), desc, Constantes.ESTADO_COMENTARIO_ACTIVO };
		
		int result = jdbcTemplate.update(sql.toString(), params);
		
		System.out.println((result>0)?"\tSe registro el comentario!!":"\tNo se registro!!");
		
		return result>0;
		
	}
	
	public boolean eliminarComentario(Pelicula p, int idComentario){
		System.out.println("\tEliminar un comentario");
		System.out.println("\t------------------------------------");
		System.out.println("\t Pelicula: " + p.getTitulo());
		System.out.println("\t Comentario: " + idComentario);
		
		StringBuffer sql =  new StringBuffer();
		sql.append("delete from t_comentario ");
		sql.append(" where id_pelicula=? and id=? ");
		
		Object[] params = new Object[]{ p.getId(), idComentario };
		
		int result = jdbcTemplate.update(sql.toString(), params);
		System.out.println((result>0)?"\tSe elimino el comentario!!":"\tNo se elimino!!");
		return result>0;
		
	}
	
	
	public boolean ocultarComentario(int idComentario) {
		System.out.println("\tOcultar un comentario");
		System.out.println("\t------------------------------------");
		System.out.println("\t comentario: " + idComentario);
		
		StringBuffer sql =  new StringBuffer();
		sql.append("update t_comentario ");
		sql.append("set estado = ? ");
		sql.append("where id = ? ");
		
		Object[] params = new Object[]{ Constantes.ESTADO_COMENTARIO_INACTIVO, idComentario };
		
		int result = jdbcTemplate.update(sql.toString(), params);
		
		System.out.println((result>0)?"\tSe oculto el comentario!!":"\tNo se oculto!!");
		
		return result>0;
	}


	public boolean valorizar(int idComentario, boolean positivo) {
		System.out.println("\tOcultar un comentario");
		System.out.println("\t------------------------------------");
		System.out.println("\t comentario: " + idComentario);
		
		Comentario comentario = findComentarioById(idComentario);
		
		StringBuffer sql =  new StringBuffer();
		sql.append("update t_comentario ");
		if(positivo)
			sql.append("set voto_pos = ? ");
		else
			sql.append("set voto_neg = ? ");
		
		sql.append("where id = ? ");
		
		Object[] params = new Object[]{ (positivo)?(comentario.getVoto_pos()+1):(comentario.getVoto_neg()+1), idComentario };
		
		int result = jdbcTemplate.update(sql.toString(), params);
		
		System.out.println((result>0)?"\tSe valorizo el comentario!!":"\tNo se valorizo!!");
		
		return result>0;
	}


	public Comentario findComentarioById(int id) {
		StringBuffer sql =  new StringBuffer();
		sql.append("select id, u.login, u.nombre, u.correo, descripcion, c.estado, fecha, voto_pos, voto_neg ");
		sql.append("from T_COMENTARIO c ");
		sql.append(" inner join T_USUARIO_WEB u on u.login = usuario_web ");
		sql.append(" where id = ?");
		
		Object[] params = new Object[]{ id };
		
		Comentario comentario = (Comentario) jdbcTemplate.queryForObject(sql.toString(), params, new RowMapper(){

			public Comentario mapRow(ResultSet rs, int arg1) throws SQLException {
				
				UsuarioWeb usuarioWeb = new UsuarioWeb(rs.getString(2), rs.getString(3), rs.getString(4));
				Comentario c = new Comentario(rs.getInt(1), usuarioWeb, rs.getString(5));
				c.setEstado(rs.getString(6));
				c.setFecha(rs.getDate(7));
				c.setVoto_pos(rs.getInt(8));
				c.setVoto_neg(rs.getInt(9));
				return c;
			}
			
		});
		
		return comentario;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Pelicula> findLast() {
		String sql = "select id, titulo, tipo_pelicula, tipo_publico, tipo_emision, pais from T_PELICULA order by id desc limit 0,10";
		
		try{
			return jdbcTemplate.query(sql, new RowMapper(){

				public Pelicula mapRow(ResultSet rs, int arg1) throws SQLException {
					Pelicula pelicula = new Pelicula(rs.getString(1), 
							rs.getString(2), 
							rs.getString(3), 
							rs.getString(4),
							rs.getString(5),
							rs.getString(6));
					return pelicula;
				}
				
			});
		}catch(EmptyResultDataAccessException e){
			return null;
		}
	}



}
